// Demo1 使用汇编实现
TEXT ·Demo1(SB),$24-0
    MOVQ $0,a-8*2(SP) // a= 0
    MOVQ $0,b-8*1(SP) // b=0

    // 将新的值写入a对应内存
    MOVQ $10,AX // ax = 10
    MOVQ AX,a-8*2(SP) //  a = ax

    // 以a为参数调用函数
    MOVQ AX, 0(SP) // 这行将AX寄存器的值移动到栈顶位置0(SP)处,作为参数准备传递给printint函数。因为printint会打印一个int参数,所以这里将a变量的值装入AX,然后传参到栈顶。
    CALL runtime·printint(SB)
    CALL runtime·printnl(SB)

    // 函数调用后，AX/BX/ 寄存器可能被污染，需要重新加载
    MOVQ a-8*2(SP),AX // ax = a
    MOVQ b-8*2(SP),BX // bx = b

    // 计算b值，并写入内存
    MOVQ AX,BX // ax = bx // b = a
    ADDQ AX,BX // bx += bx // b += a
    IMULQ AX,BX // bx *= ax // b *= a
    MOVQ BX,b-8*1(SP) // b=bx

    // 以b为参数调用函数
    MOVQ BX,0(SP)
    CALL runtime·printint(SB)
    CALL runtime·printnl(SB)

    RET

// ⬇⬇⬇⬇⬇优化
TEXT ·main(SB),$24-0
    // 将新的值写入a对应内存
    MOVQ $10,AX  // ax=10
    MOVQ AX,temp-8(SP) // temp = ax

    // 以a为参数调用函数
    CALL runtime·printint(SB)
    CALL runtime·printnl(SB)

    // 函数调用后，AX可能被污染，需要重新加载
    MOVQ temp-8(SP),AX // ax = temp

    // 计算b值, 不需要写入内存
    MOVQ AX,BX // bx=ax
    ADDQ BX,BX // bx+=bx
    IMULQ AX,BX // bx*=ax

    CALL runtime·printint(SB)
    CALL runtime·printnl(SB)

    RET
